# 2019-01-20
# 王刚刚
# v1.0
# 适用于SQL已经经过PL/SQL格式化后对sql进行的微调
import os
import sys

filePath = sys.argv[1]  # 文件路径  python TableSplit.py D:\test\txt\uu\create.sql
fileEncoding = "GBK"   # 文本编码格式
pyFilePath = os.path.split(os.path.realpath(__file__))[0]  # 获取当前文件路径
# 关键字需要上下对照
paramFileOld = ['select', 'create', 'from']
paramFileNew = ['SELECT', 'CREATE', 'FROM']

# 判断文件是否存在
if not os.path.isfile(filePath):
    if not os.path.isfile(pyFilePath + "/" + filePath):
        print("文件不存在！！！")
    else:
        filePath = pyFilePath + "/" + filePath

'''
with open(filePath, 'r', encoding=fileEncoding) as fo:
    fileText = fo.read().lower()
    # 循环将相应的关键字小写转大写
    for i in range(len(paramFileOld)):
        fileText = fileText.replace(paramFileOld[i], paramFileNew[i])
    print(fileText)
'''
# 我需要知道两个参数一个坐标，一个是在这个关键字之前是否存在同样的关键字
with open(filePath, 'r', encoding=fileEncoding) as fo:
    str1 = ""
    text = ""
    count = 0
    maxA = 0
    stat = 0  # 状态位
    list1 = []
    list2 = []
    list3 = []
    list4 = []
    for i in fo:
        i = i.lstrip().lower()  # 截掉字符串左边的空格,并将字符变为小写
        str2 = ""  # 每次使用完后需要清空

        # 截取第一个字符判断是否是关键字
        if i.split(" ")[0] in paramFileOld:
            str1 = i.split(" ")[0]

            # 规则1：create 顶格写
            if "create" == str1:
                list2.append(0)
                str2 = i

            # 规则2:from上面必然有对应的select,去俩位置
            if "from" == str1:
                param1 = list2[count-1] + 2
                fromStr = " " * param1 + i  # 重复输出空格相应个数
                list2.append(param1)

                # 字段的
                stat = 0
                a = list1.count("select")  # 获取select的个数
                for c in range(len(list3)):
                    param2 = (maxA + 2 - len(list3[c]))
                    # 重复输出空格相应个数
                    str2 = str2 + " " * ((a + 4) * 2 - 1) + list3[c] + " " * param2 + "/*" + list4[c]
                str2 = str2 + fromStr

            # 规则3:select去俩位置
            if "select" == str1:
                a = list1.count("select")  # 获取select的个数
                list2.append((a + 1) * 2)  # 每个select都比前一个多退两格
                str2 = " " * ((a + 1) * 2) + i  # 重复输出空格相应个数
                if "from" not in i:
                    # 当select 与 from 不在同一行时
                    stat = 1

            # 规则5:grant
            if "grant" == str1:

                pass

            # 规则6:order
            if "order" == str1:
                pass

            list1.append(str1)
            count += 1

        # 规则4:select下面的字段
        if stat > 0 and i.split(" ")[0] not in paramFileOld:
            #  判断是否存在注释信息，如果存在则将相应的注释信息的位置放置整齐
            #  每个字段的,放置到字段后面而不是注释信息后面
            #  获取最长的一个字段的长度
            if maxA < len(i.split("/*")[0]):
                maxA = len(i.split("/*")[0])

            list3.append(i.split("/*")[0])
            if len(i.split("/*")) > 0:
                list4.append(i.split("/*")[1])
            else:
                list4.append("")

        # 这个SQL完结出现#符号
        if "#" in i:
            list1 = []
            list2 = []
            list3 = []
            list4 = []
            count = 0
            maxA = 0

        text = text + str2
    print(text)
